/*
 * Event.h
 *
 *  Created on: 2011/07/02
 *      Author: naoki
 */

#ifndef INCLUDED_NTENGINE_THREADING_EVENT_H
#define INCLUDED_NTENGINE_THREADING_EVENT_H

namespace NTEngine {
namespace Threading {

/**
 * @brief イベント
 */
class Event {
public:
	/**
	 * @brief インスタンスを生成します
	 * @param state 初期シグナルの状態を指定します
	 */
	static Event create( bool state = false );

	/**
	 * @brief trueにされるのを待つ
	 */
	void wait() const;

	/**
	 * @brief trueにする
	 */
	void set();

	/**
	 * @brief falseにする
	 */
	void reset();

	/**
	 * @brief true か falseか
	 */
	bool isSet() const;

	Event();
	~Event();
	Event( const Event& );
	Event& operator=( const Event& );
	operator void*() const;
	void release();
	bool operator==( const Event& ) const;
	bool operator!=( const Event& ) const;
	int referenceCount() const;
private:
	class Impl;
	Impl* mImpl;
};

} // namespace Threading
} // namespace NTEngine

#endif // INCLUDED_NTENGINE_THREADING_EVENT_H
